#include <iostream>
#include <string>
#include <cctype>

using std::cout;
using std::string;
using std::endl;

int main(int argc, char **argv)
{
    // 拷贝初始化
    string s1 = "Hello World";
    // 直接初始化
    string s2("Hello World");

    cout << "s2" << s2;

    /**
     * string::size_type 本质上一个无符号类型的数值，而且能够存放下任何string
     * 对象的大小，所有用于存放string类的size函数返回值的变量，都应该是string::size_type
     */
    string::size_type len = s2.size();
    cout << "len" << len;
    auto len2 = s2.size();
    cout << "len2" << len2;

    if (!s1.empty())
        cout << "Size: " << s1.size() << ": " << s1;

    /**
     * string对象的比较
     *  a. 比较过程: 比较运算逐一比较string对象中的字符，并且对大小写敏感，也就是说
     * 再比较同一个字母的大写形式和小写形式是不同的
     *  b. 使用 “==”和 “!=” 进行比较运算
     */
    if (s1 == s2)
        cout << "s1 == s2" << endl;
    if (s1 != s2)
        cout << "s1 != s2" << endl;

    /* 使用for语句处理字符串中的每个字符 */
    for (auto c: s1)
        cout << c << endl;

    /**
     * decltype关键字声明计数变量count,它的类型是s.size函数返回值类型，也就是
     * string::size_type
     */
    decltype(s1.size()) count = 0;
    for (auto c: s1) {
        count += 1;
    }
    cout << "count: " << count;

    /**
     * 引用: 所谓引用只是给定对象的一个别名
     * 使用引用作为循环控制变量时，这个变量实际上被依次绑定到了序列的每个
     * 元素上，使用这个引用，我们就能改变变量绑定的字符
     */
    for (auto &c: s1)
        c = toupper(c)
    cout << c << endl;

    return 0;
}